package demo;

class OuterClass {
    public int data1 = 1;
    private int data2 = 2;
    public static int data3 = 3;
    class InnerClass {//实例内部类
        public int data1 = 1111;
        public int data4 = 4;
        private int data5 = 5;
        public static final int data6 = 6;//实例内部类中想要进行获得static修饰的变量需要使用static + final
        public void test() {
            System.out.println(data1);//就近选择本身data1
            System.out.println(this.data1);//调用本身this
            System.out.println(OuterClass.this.data1);//都存在情况下,调用外部类有两种方法
            // 1.实例化外部类,使用对象指向调用 2.使用外部类类名.this调用
            System.out.println("test::InnerClass");
        }
    }
    public void test() {
        System.out.println("test::OuterClass");
    }
}
interface InterFaceA {
    void func();
}
class TestA implements InterFaceA {
    public void func() {
        System.out.println("func::TestA");
    }
}
public class Test {
    public void test() {
        class A {
            public void func() {
                System.out.println("Test::test");
            }
        }
        //局部内部类(定义在外部类方法内部):只能在方法内部进行实例化
        A a = new A();
        a.func();
    }

    public static void main(String[] args) {
        //局部内部类
        Test test = new Test();
        test.test();
    }
    public static void main2(String[] args) {
        //匿名内部类
        TestA testA = new TestA();
        testA.func();
        InterFaceA a = new InterFaceA() {//匿名内部类:可以理解实现了一个接口
            public void func() {
                System.out.println("func::匿名内部类");
            }
        };
        new InterFaceA() {//匿名内部类:可以理解实现了一个接口
            public void func() {
                System.out.println("func::匿名内部类");
            }
        }.func();
        //调用匿名内部类方法
        //1.使用接口接收匿名内部类,然后进行调用
        //2.直接在匿名内部类外.方法名
        a.func();
    }
    public static void main1(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.test();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        //需要实例化实例内部类,需要使用外部类.内部类 外部类对象.new 实例内部类
        innerClass.test();
    }
}
